# https://cuiqingcai.com/6080.html
import logging
# logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s -%(levelname)s -%(message)s')
# logging = logging.getLogger(__name__)

# logging.info('This is a log info')
# logging.debug('Debugging')
# logging.warning('Waring exists')
# logging.info('Finish')

# basicConfig 的参数：
# filename：即日志输出的文件名，如果指定了这个信息之后，实际上会启用 FileHandler，而不再是 StreamHandler，这样日志信息便会输出到文件中了。
# filemode：这个是指定日志文件的写入方式，有两种形式，一种是 w，一种是 a，分别代表清除后写入和追加写入。
# format：指定日志信息的输出格式，即上文示例所示的参数，部分参数如下所示：
# %(levelno) s：打印日志级别的数值。
# %(levelname) s：打印日志级别的名称。
# %(pathname) s：打印当前执行程序的路径，其实就是 sys.argv[0]。
# %(filename) s：打印当前执行程序名。
# %(funcName) s：打印日志的当前函数。
# %(lineno) d：打印日志的当前行号。
# %(asctime) s：打印日志的时间。
# %(thread) d：打印线程 ID。
# %(threadName) s：打印线程名称。
# %(process) d：打印进程 ID。
# %(processName) s：打印线程名称。
# %(module) s：打印模块名称。
# %(message) s：打印日志信息。
# datefmt：指定时间的输出格式。
# style：如果 format 参数指定了，这个参数就可以指定格式化时的占位符风格，如 %、{、$ 等。
# level：指定日志输出的类别，程序会输出大于等于此级别的信息。
# stream：在没有指定 filename 的时候会默认使用 StreamHandler，这时 stream 可以指定初始化的文件流。
# handlers：可以指定日志处理时所使用的 Handlers，必须是可迭代的。
logging.basicConfig(level=logging.DEBUG, filename='output.log', datefmt='%Y/%m/%d %H:%M:%S',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s')
logger = logging.getLogger(__name__)
logging.info('This is a log info')
logging.debug('Debugging')
logging.warning('Waring exists')
logging.info('Finish')
# 日志的等级信息，logging 模块共提供了如下等级，每个等级其实都对应了一个数值，列表如下：
# CRITICAL  50
# FATAL     50
# ERROR     40
# WARNING   30
# WARN      30
# INFO      20
# DEBUG     10
# NOTSET    0
# 对于 WARNING 还提供了简写形式 WARN，两个对应的数值都是 30。 我们设置了输出 level，系统便只会输出 level 数值大于或等于该 level 的的日志结果
